/*
 * GenerarBaseDAO.java
 *
 * Created on 12 de febrero de 2007, 10:01 AM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.consultas.generarbase.dao;

import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.consultas.base.constantes.ConstantesGenerales;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import static com.src.computec.radar.consultas.base.constantes.ConstantesGenerales.SCHEMA;
import com.src.computec.radar.consultas.generarbase.dto.BaseDto;
import com.src.computec.radar.consultas.source.ConsultasSource;
import com.src.computec.radar.services.utilities.dto.InsertoDto;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author aocampo
 */
public class GenerarBaseDAO extends GenericDAO implements BaseGenerarBaseDAO {
    
    /** Creates a new instance of GenerarBaseDAO */
    public GenerarBaseDAO() {
    }
    
    public List getBaseByNumeroOrden(String numeroOrden, boolean conInsertos, boolean conTipoDestinoCliente) throws DAOException 
    {
        List listObjects = new ArrayList();
        List listBase = new ArrayList();  
        
        String baseSelect = "SELECT OP.FECHA_CORTE_PROCESO, OP.CICLO, D.CODIGO_INTERNO_CLIENTE, D.NOMBRE_ABONADO, D.TELEFONO_ABONADO, E.DIRECCION_DESTINATARIO, E.SITIO_ORIGINAL, " +
                            "E.CODIGO_BARRAS, TGE.NOMBRE_TIPO_GESTION, GE.NOMBRE_GESTION, E.FECHA_ULTIMA_GESTION, E.NUMERO_ORDEN";
        String baseFrom = " FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoin = "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN " +
                               "INNER JOIN " + SCHEMA + ".DOCUMENTO D ON E.CODIGO_BARRAS = D.CODIGO_BARRAS " +
                               "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                               "INNER JOIN " + SCHEMA + ".TIPO_GESTION_ENVIO TGE ON GE.CODIGO_TIPO_GESTION = TGE.CODIGO_TIPO_GESTION ";
        String baseWhere = "WHERE ";
        String baseGroupBy = "GROUP BY OP.FECHA_CORTE_PROCESO, OP.CICLO, D.CODIGO_INTERNO_CLIENTE, D.NOMBRE_ABONADO, D.TELEFONO_ABONADO, E.DIRECCION_DESTINATARIO, E.SITIO_ORIGINAL, " +
                             "E.CODIGO_BARRAS, TGE.NOMBRE_TIPO_GESTION, GE.NOMBRE_GESTION, E.FECHA_ULTIMA_GESTION, E.NUMERO_ORDEN";
        
        int indice = 1;
        if (!numeroOrden.equals("")) 
        {
            baseWhere += "E.NUMERO_ORDEN = ?";
            listObjects.add(numeroOrden);
        }
        if (conTipoDestinoCliente) 
        {
            baseSelect += ", TDC.NOMBRE_TIPO_DESTINO_CLIENTE";
            /*baseInnerJoin += "INNER JOIN " + SCHEMA + ".MUNICIPIO_DESTINO_CLIENTE MDC ON E.CODIGO_CLIENTE = MDC.CODIGO_CLIENTE AND E.CODIGO_DEPARTAMENTO = MDC.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = MDC.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = MDC.CODIGO_CENTROP " +
                             "INNER JOIN " + SCHEMA + ".TIPO_DESTINO_CLIENTE TDC ON MDC.CODIGO_TIPO_DESTINO_CLIENTE = TDC.CODIGO_TIPO_DESTINO_CLIENTE ";*/
            baseInnerJoin += "INNER JOIN " + SCHEMA + ".TIPO_DESTINO_CLIENTE TDC ON E.CODIGO_CLIENTE = TDC.CODIGO_CLIENTE " +
                             "INNER JOIN " + SCHEMA + ".MUNICIPIO_DESTINO_CLIENTE MDC ON E.CODIGO_CLIENTE = MDC.CODIGO_CLIENTE AND TDC.CODIGO_TIPO_DESTINO_CLIENTE = MDC.CODIGO_TIPO_DESTINO_CLIENTE AND E.CODIGO_DEPARTAMENTO = MDC.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = MDC.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = MDC.CODIGO_CENTROP ";
            baseGroupBy += ", TDC.NOMBRE_TIPO_DESTINO_CLIENTE";
        }
        
        /**
         * Realizacion de Queries
         */
        Connection con = null;
        PreparedStatement statementBase = null;
        ResultSet rsBase = null;
        
        try 
        {
            con = getConnectionDB2();
            statementBase = con.prepareStatement(baseSelect + baseFrom + baseInnerJoin + baseWhere + baseGroupBy);
            
            Iterator iterator = listObjects.iterator();
            indice = 0;
            while (iterator.hasNext()) {
                statementBase.setObject(++indice, (String) iterator.next());
            }
            rsBase = statementBase.executeQuery();
            while (rsBase.next()) 
            {
                indice = 0;
                BaseDto baseDto = new BaseDto();
                baseDto.setFechaCorteProceso(rsBase.getDate(++indice));
                baseDto.setCiclo(rsBase.getString(++indice));
                baseDto.setCodigoInternoCliente(rsBase.getString(++indice));
                baseDto.setNombreAbonado(rsBase.getString(++indice));
                baseDto.setTelefonoAbonado(rsBase.getString(++indice));
                baseDto.setDireccionDestinatario(rsBase.getString(++indice));
                baseDto.setSitioOriginal(rsBase.getString(++indice));
                baseDto.setCodigoBarras(rsBase.getString(++indice));
                baseDto.setNombreTipoGestion(rsBase.getString(++indice));
                baseDto.setNombreGestion(rsBase.getString(++indice));
                baseDto.setFechaUltimaGestion(rsBase.getDate(++indice));
                baseDto.setNumeroOrden(rsBase.getString(++indice));
                
                if (conTipoDestinoCliente) {
                    baseDto.setNombreTipoDestinoCliente(rsBase.getString(++indice));
                }
                listBase.add(baseDto);
            }
        }
        catch (SQLException e) 
        {
            throw new DAOException("GenerarBaseDAO:getBaseByNumeroOrden:" + e.toString(), e);
        }
        finally 
        {
            closeConnection(con, statementBase, rsBase);            
        }
            
        /**
         * Realiza la parte de los insertos
         */
        Connection con2 = null;
        PreparedStatement statementInsertos = null;
        ResultSet rsInsertos = null;
        
        try
        {
            con2 = getConnectionDB2();
            statementInsertos = con2.prepareStatement("SELECT IE.CODIGO_BARRAS, IE.CODIGO_INSERTO, IE.NUMERO_ORDEN, I.DESCRIPCION_INSERTO " +
                                                      "FROM " + SCHEMA + ".INSERTO_ENVIO IE " +
                                                      "INNER JOIN " + SCHEMA + ".INSERTO I ON IE.CODIGO_INSERTO = I.CODIGO_INSERTO AND IE.NUMERO_ORDEN = I.NUMERO_ORDEN " +
                                                      "WHERE IE.CODIGO_BARRAS = ? ");
            
            Iterator iterTemp = listBase.iterator();
            
            while(iterTemp.hasNext())
            {
                BaseDto baseDto = (BaseDto)iterTemp.next();
                
                if (conInsertos) 
                {
                    int indice1 = 0;
                    List listInsertos = new ArrayList();
                    statementInsertos.setObject(++indice1, baseDto.getCodigoBarras());
                    rsInsertos = statementInsertos.executeQuery();
                    
                    while (rsInsertos.next()) 
                    {
                        indice1 = 0;
                        InsertoDto insertoDto = new InsertoDto();
                        insertoDto.setCodigoBarras(rsInsertos.getString(++indice1));
                        insertoDto.setCodigoInserto(rsInsertos.getString(++indice1));
                        insertoDto.setNumeroOrden(rsInsertos.getString(++indice1));
                        insertoDto.setDescripcionInserto(rsInsertos.getString(++indice1));
                        listInsertos.add(insertoDto);
                    }
                    
                    if (!listInsertos.isEmpty()) 
                    {
                        baseDto.setListInsertos(listInsertos);
                    }
                }
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("GenerarBaseDAO:getBaseByNumeroOrden:findInsertos:" + e.toString(), e);
        }
        finally 
        {
            closeConnection(con2, statementInsertos, rsInsertos);
        }
        return listBase;
    }
    
    public void insertMensajeAlerta(String fileName, String ldapUser, int numeroRegistros, String numeroOrden) throws DAOException {
        Connection con = null;
        PreparedStatement statement = null;
        String descripcionMensajeAlerta = ConstantesGenerales.DESCRIPCION_MENSAJE_ALERTA_CRUCE_INFORMACION.replace("?", Integer.toString(numeroRegistros));
        descripcionMensajeAlerta.replace("#", numeroOrden);
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("INSERT INTO " + SCHEMA + ".MENSAJE_ALERTA (CODIGO_TIPO_ARCHIVO, CODIGO_RESPONSABLE, DESCRIPCION_MENSAJE_ALERTA, ORIGEN_MENSAJE_ALERTA, PATH_MENSAJE_ALERTA, FECHA_REGISTRO, ESTADO) " +
                                             "VALUES (?, ?, ?, ?, ?, ?, ?)");
            int indice = 0;
            
            statement.setObject(++indice, ConstantesGenerales.FILE_CODE);
            statement.setObject(++indice, ldapUser);
            statement.setObject(++indice, descripcionMensajeAlerta);
            statement.setObject(++indice, ConstantesGenerales.FILE_ORIGIN_GENERAR_BASE);
            statement.setObject(++indice, fileName);
            statement.setTimestamp(++indice, new Timestamp((new Date()).getTime()));
            statement.setObject(++indice, ConstantesGenerales.FILE_ACTIVE);
            statement.executeUpdate();
        }
        catch (SQLException e) {
            throw new DAOException("GenerarBaseDAO:insertMensajeAlerta:" + e.toString(), e);
        }
        finally {
            closeConnection(con, statement);
        }
    }
}